package cn.zhp.interceptor;

import cn.zhp.entity.SysResource;
import cn.zhp.service.SysResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 自定义权限拦截
 * 1.获取系统所有需要授权资源，判断当前请求是否需要授权，如果不需要授权放行
 * 2.对需要授权的请求进行授权处理，获取用户的所有权限，进行判断是否有权限
 */
public class ResourcesInterceptor implements HandlerInterceptor {

    /**
     * springmvc的拦截器可以在spring容器中获取服务层组件bean
     */
    @Autowired
    SysResourceService resourceService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取系统所有需要授权权限
        List<SysResource> sysResources = resourceService.selectResources();
        //获取请求路径
        String uri = request.getRequestURI().replace(request.getContextPath() + "/", "");
        // 默认标识不需要授权
        boolean flag = false;
        //判断当前请求是否需要授权，如果不需要授权放行
        for (SysResource sysResource : sysResources) {
            if (sysResource.getUrl().equals(uri)) {
                //找到匹配的url，标识为是需要授权的权限
                flag = true;
                break;
            }
        }
        //ture需要授权的请求需要
        if (flag) {
            //获取用户的所有权限，进行判断是否有权限访问
            List<SysResource> resources = (List<SysResource>) request.getSession().getAttribute("resources");
            for (SysResource resource : resources) {
                if (resource.getUrl().equals(uri)) {
                    //有权限访问
                    return true;
                }
            }
        } else {
            //不需要授权处理，放行    公共资源、按钮级别
            return true;
        }

        //不放行，重定义到无权限访问页面
        response.sendRedirect(request.getContextPath() + "/notauth.html");
        return false;
    }
}
